package com.company;

//总结：对象分配在伊甸园中
//        新生代空间不足时，触发minor GC。伊甸园和from存活的对象copy到to幸存区，存活的对象年龄+1 ，并且交换from to
//        minor GC 会引发Stop the world ,暂停其它线程，等待垃圾回收结束，用户线程才恢复运行。
//        当对象寿命超过阀值（最大寿命15次 =对象头4bit 1111）时候(可以提前)，会晋升到老年代。
//        当老年代空间不足，先尝试Minor GC 发现空间仍然不足，就触发FullGC ，也会引起Stop the world (stw)
//        老年代算法（标记清理 或者 标记整理），如果分配失败，就触发OOM。
// -Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc
public class C09GC_UseSerialGC {
    private static final int _521KB=512*1024;
    private static final int _1MB=1*1024*1024;
    private static final int _6MB=6*1024*1024;
    private static final int _7MB=7*1024*1024;
    private static final int _8MB=8*1024*1024;
    public static void main(String[] arg0) throws InterruptedException {
//       ArrayList<byte[]> list=new ArrayList<>();
//        list.add(new byte[_7MB]);
//        list.add(new byte[_521KB]);
//        list.add(new byte[_521KB]);

//        大对象 放不下，直接放到老年代去
//        ArrayList<byte[]> list=new ArrayList<>();
//        list.add(new byte[_8MB]);

//        OOM
//        ArrayList<byte[]> list=new ArrayList<>();
//        list.add(new byte[_8MB]);
//        list.add(new byte[_8MB]);

//      内存溢出发生在线程内，但是没有引起主线程的停止
//        new Thread(()->{
//            ArrayList<byte[]> list=new ArrayList<>();
//            list.add(new byte[_8MB]);
//            list.add(new byte[_8MB]);
//        }).start();

        Thread.sleep(2000);


    }
}
